home *** CD-ROM | disk | FTP | other *** search
- Path: news.magicnet.net!usenet
- From: catello@magicnet.net (Michael Catello)
- Newsgroups: comp.lang.c++
- Subject: object creation from an abstract base class
- Date: Wed, 06 Mar 1996 04:24:47 GMT
- Organization: MagicNet, Inc.
- Message-ID: <4hj3te$f66@comet.magicnet.net>
- NNTP-Posting-Host: pm2-13.magicnet.net
- X-Newsreader: Forte Free Agent 1.0.82
-
- Hello OOPsters,
-
- I was just looking for validation/other suggestions for a method I
- recently used in a program. I have defined an abstract base class
- (i.e. contains pure virtual functions), all access to the derived
- classes of this base are thru a pointer to the base class. To create
- the actual objects of the derived classes I used the following scheme:
-
-
- enum FooType {BAR, BAS};
-
- // base class
- class CFoo
- {
- CFoo();
- ~CFoo();
-
- static CFoo* CreateFoo(FooType type);
-
- // other methods/data including pure virtual fns whose behaviour will
- be defined in the derived classes
- };
-
- class CBar: public CFoo
- {
- //
- };
-
- class CBas: public CFoo
- {
- //
- };
-
- CFoo* CFoo::CreateFoo(FooType type)
- {
- CFoo* pfoo = NULL;
-
- switch (type)
- {
- case BAR:
- pfoo = new CBar;
- break;
- case BAS:
- pfoo = new CBas;
- break;
- }
-
- return pfoo;
- }
-
- main()
- {
- CFoo* interface = CFoo::CreateFoo(BAR);
- }
-
- Obviously it is the CreateFoo() function that I am wondering about. In
- the actual implementation I had multiple static "Create" functions for
- the base class that would allow me to create a new object: one based
- on an enumerated token (shown above), another an existing object, as
- well as one based on the format of a datafile. My application never
- references any of the derived classes directly, except in their
- creation and definition.
-
- Is there another/better/more appropriate way to handle this type of
- object creation? Thanks for your assistance,
-
- Regards,
- -Michael.
-
- /*
- * catello@magicnet.net
- * http://www.magicnet.net/~catello
- * CompuServe: 70401,3661
- */
-
-